test(prose): declare the prose each case actually walks - #574
Merged
Conversation
This was referenced Jul 27, 2026
Merged
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:52
29ea473 to
9b65f33
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 15:53
15960f6 to
3796225
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:53
9b65f33 to
e1768aa
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 15:54
3796225 to
93eeae7
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:54
e1768aa to
f183907
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 15:56
93eeae7 to
8c7ae09
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:56
f183907 to
0d521e0
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 15:57
8c7ae09 to
4073006
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:57
0d521e0 to
2898e16
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 15:58
4073006 to
c959550
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:58
2898e16 to
191def2
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 15:59
c959550 to
249f415
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 15:59
191def2 to
f0538ab
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 16:00
249f415 to
1a81cbb
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 16:00
f0538ab to
2bdd2b0
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 16:01
1a81cbb to
77b5189
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 16:01
2bdd2b0 to
55c5f21
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 16:02
77b5189 to
992639b
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 16:02
55c5f21 to
8f006ce
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 17:05
992639b to
f6f4e39
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 17:05
8f006ce to
8e57697
Compare
leeovery
force-pushed
the
fix/prose-prescribe-what-we-observed
branch
from
July 27, 2026 17:06
f6f4e39 to
7fbbbd8
Compare
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 17:06
8e57697 to
994d724
Compare
leeovery
changed the base branch from
fix/prose-prescribe-what-we-observed
to
main
July 27, 2026 17:06
A case's file list decides whether editing a file selects that case for a run, so a file the walk goes through and the case omits is prose that can be changed without the test covering it ever running again. Seven of the ten had such gaps; ten declarations were missing in total. They were measured, not reasoned about. Each case was walked with its own act, and the list taken from the Read calls in the record. An earlier attempt to derive them by following Load links from the scoped files gave the wrong answer, and I repeated its output as fact before checking: it reports everything reachable, which for the discovery cases meant session-loop, task-loop and conclude-discovery — branches every case deliberately stops before. Three cases turned out to have no gap at all. The omissions are systematic rather than scattered, and they share one cause. invoke-skill.md is absent from three of the four entry cases; it is where every entry skill builds its handoff. casing-conventions.md is absent from all three cases that begin at workflow-start; it is Step 0.1. detection-core.md is absent from both discovery cases; it is Step 2. Each time the list named the files the case is *about* and left out the ones it merely passes through — which is the distinction the whole mechanism turns on. One measured result is deliberately not applied. discussion-entry opens gather-context.md, but the prose only routes there when no carrier exists, and that case has one: the file was read while deciding the branch, not walked. The lint sees opened, not walked, so every result it gives needs that check before it lands. Also restores the literal characters in every case.json. Earlier scripted edits wrote them through a JSON encoder that escaped em-dashes, and the escapes were committed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ough A full run over the freshly-filled file lists reported two cases still opening prose they do not declare: implementation-picks-first-task reads invoke-skill.md, and discovery-commits-new-epic reads resume-detection.md. Both were measured clean during the harvest, by a walk that genuinely did not open them. The harvest walked each case once, and once is a sample: a walk touches a slightly different set of files each time it runs, so a single measurement floors the answer rather than settling it. That is worth knowing about the mechanism itself. A file list converges across runs rather than being audited in one pass, and the lint is the ratchet that closes the gap each time a new file surfaces — not a one-shot check that can be declared finished. The implementation case is the sharper illustration. During the harvest its walker claimed to have read invoke-skill.md, the record showed it had not, and the divergence was recorded as a walker misreporting itself. It was — and the file it invented reading is genuinely on the path, which the next run took. A false claim landed on a true fact. invoke-skill.md is now declared by all four entry cases, which is what the path shape always implied: it is where every entry skill builds its handoff. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every case so far stops where a skill hands off, which is where the phase begins doing work. Seven processing skills had no coverage at all. This carries on through the handoff into workflow-investigation-process and stops at that phase's durability boundary: the file created, the topic registered, the commit landed, immediately before the symptom interview. The spine is an ordering claim that crosses the skill boundary — the entry's status check must precede the processing skill's topic start, because a topic cannot be started before anything has looked to see whether it already exists. Alongside it, initialisation must read the work's seed before writing: the prose opens the phase from the work's origin, and a walk that wrote first would build the file from nothing. Scoped to Steps 0 through 2 after reading Step 3, which is a question bank rather than a gate — Core, Reproduction, Environment, Impact, Follow-up. That is the organic loop `conduct` is for, and it is better to shape that field against a case that demands it than to guess now. Passed first run: 5/5 with the further claim, all four checks, world matched, and no undeclared prose — the file list was right without a harvest pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
leeovery
force-pushed
the
test/prose-declare-what-walks
branch
from
July 27, 2026 17:06
994d724 to
0e77958
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A case's
files[]decides whether editing a file selects that case for a run. A file the walk goes through and the case omits is prose that can be changed without the test covering it ever running again.Seven of ten had gaps — ten declarations missing.
validate-phase.mdinvoke-skill.mdinvoke-skill.mdinvoke-skill.mdcasing-conventions.md,active-work.mdcasing-conventions.md,detection-core.mdcasing-conventions.md,detection-core.mdinvestigation-entry,spec-entry-from-discussionandimplementation-picks-first-taskhad no gap.Measured, not reasoned about
Each case was walked with its own
act.mdand the list taken from theReadcalls in the record — ten walkers, one per case.An earlier attempt derived them by following Load links from the scoped files, and I repeated its output as fact before checking. It reports everything reachable: for the discovery cases that meant
session-loop.md,task-loop.md,conclude-discovery.md— branches every case deliberately stops before. Measuring found three cases already correct that the crawl had condemned.The omissions share one cause
invoke-skill.md— missing from 3 of 4 entry cases. Where every entry skill builds its handoff.casing-conventions.md— missing from all 3 cases starting atworkflow-start. It's Step 0.1.detection-core.md— missing from both discovery cases. It's Step 2.Each list named the files the case is about and omitted the ones it merely passes through — the exact distinction the mechanism turns on.
One result deliberately not applied
discussion-entryopensgather-context.md, but the prose only routes there when no carrier exists — and that case has one. The file was read while deciding the branch, not walked. The lint sees opened, not walked, so every result it produces needs that check before it lands.Also
Restores literal characters in every
case.json. Earlier scripted edits wrote them through a JSON encoder that escaped em-dashes to—, and the escapes were committed.Test plan
🤖 Generated with Claude Code
Stack